<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace app\index\controller\finance;

/**
 * 微派H5支付
 *
 * @author SoChishun
 */
class Wiipayh5Controller extends \app\index\controller\BaseController {

    public function dowiipayh5Action() {
        $request = \think\Request::instance();
        $request->only(['amount', 'token']);
        $data = $request->post();
        $recharge = new \app\index\model\finance\RechargeModel();
        $result = $recharge->saveRecharge($data, $this->loginInfo['id'], 'cz', 'wiipayh5');
        if (!$result['success']) {
            return $result;
        }
        $out_trade_no = $result['message']['out_trade_no'];
        $amount = $data['amount'];

        $app_id = '3db1cffa7cdd7c68b80d8775dc61b5e2'; //微派分配的appId,联系运营人员获取，实际项目中请替换真实appId
        $body = '在线充值' . $amount . '元'; //商品名称，必填项，请勿包含敏感词
        $callback_url = url('finance.recharge/history'); //支付成功后跳转的商户页面(用户看到的页面)
        $channel_id = 'default'; //渠道编号
        $out_trade_no = $out_trade_no; //商户单号，确保不重复，如想透传更多参数信息，建议以Json-->String->Base64编码后传输，必填项
        $total_fee = '0.01'; //商品价格(单位:元)，必填项
        $version = '2.0'; //版本号，默认填写2.0即可，必填项

        $key = 'CRCBwJce5ku88n8LSEbRWTg5dWAkJBiq'; //签名所需key,联系运营人员获取
        //本签名示例，仅为了演示，实际项目中为了安全考虑，请勿将key对外。字符串拼接规则为，参与签名的参数，按字母序key=value方式然后加上key进行md5,最后sign转大写
        $sign_prep = 'app_id=' . $app_id . '&body=' . $body . '&callback_url=' . $callback_url . '&channel_id='
                . $channel_id . '&out_trade_no=' . $out_trade_no . '&total_fee=' . $total_fee . '&version=' . $version . $key;

        $sign = strtoupper(md5($sign_prep)); //签名串,签名规则:MD5，utf-8
        $params = [
            //'instant_channel'=>'ali',//配置默认支付方式，当仅有一个支付方式时，不会弹出收银台，会直接跳转到支付界面；支付宝ali，微信公众号wx，银联un，网银wy，此参数不参与签名
            'debug' => 1, //开启调试模式，会显示错误信息，注意，上线后需要去掉，此参数不参与签名
            'body' => $body,
            'callback_url' => $callback_url,
            'channel_id' => $channel_id,
            'out_trade_no' => $out_trade_no,
            'total_fee' => $total_fee,
            'sign' => $sign,
            'version' => $version
        ];
        return ['success' => true, 'message' => $params];
    }

    public function notifyAction() {
        /*
          orderNo	订单号	是	String(255)	如果多次同步，则按此字段去重
          synType	支付类型	是	String(20)	wiipay：短信; prepaid：充值卡、点卡; upmp：银联; alipay：支付宝; wxpay：微信
          status	状态	是	String(20)	success为成功，其他为失败
          price	价格	是	String(11)	单位元
          time	时间	是	String(255)	例如 20150729171606
          cpparam	透传参数	否	String(200)	请求时的透传参数(out_trade_no)，原样返回
          sign	签名	否	String(32)	详情见签名机制
         */
        /*
          签名步骤如下：
          1、	将除sign以外的参数名按字母顺序排列，并和参数值拼接成如下形式：
          key1=value1&key2=value2&……
          2、	加上分配的md5key后转成大写md5值。
          举例：
          收到的参数为：
          cpparam : 123456789
          orderNo : 10271944028870003
          price : 1.5
          status : success
          synType : wxpay
          time : 20170221200707
          sign : 161899951EE8088079C9B0580A362D0E
          分配的key为：CRCBwJce5ku88n8LSEbRWTg5dWAkJBiq
          则签名方式为(除去sign)
          MD5(cpparam=123456789&orderNo=10271944028870003&price=1.5&status=success&synType=wxpay&time=20170221200707CRCBwJce5ku88n8LSEbRWTg5dWAkJBiq).toUpperCase()
          转成大写签名为：161899951EE8088079C9B0580A362D0E
          判断签名字符串和传递的sign是否一致，一致则表示验证成功，需返回success
         */
        $request = \think\Request::instance();
        $data = $request->only(['orderNo', 'synType', 'status', 'price', 'time', 'cpparam', 'sign'])->param();

        if (empty($data['orderNo'] || empty($data['sign']))) {
            echo 'success';
            return; // 交易单号无效
        }
        $key = 'CRCBwJce5ku88n8LSEbRWTg5dWAkJBiq'; //签名所需key,联系运营人员获取
        $sign = $data['sign'];
        unset($data['sign']);
        $data['time'] = $data['time'] . $key;
        ksort($data);
        $signtmp = strtoupper(md5(http_build_query($data)));
        if ($sign != $signtmp) {
            echo 'success';
            return; // 签名无效
        }
        $out_pay_no = $data['orderNo'];
        $out_trade_no = $data['cpparam'];
        if (strpos($out_trade_no, 'cz') > -1) {
            // 充值
            $recharge = new \app\index\model\finance\RechargeModel();
            $result = $recharge->rechargeConfirm($out_trade_no, $this->loginInfo['id']);
        } else if (strpos($out_trade_no, 'jc') > -1) {
            // 竞猜1分钱
            $game = new \app\index\model\GameRecordModel();
            $result = $game->notifyRecord($out_trade_no, $out_pay_no, $this->loginInfo['id']);
        }
        if (!$result['success']) {
            echo 'success';
            exit; //$result['message'];
        }
        echo 'success';
    }

    // backurl
    public function resultAction() {
        /*
         * 用户支付成功后，平台将引导用户跳转回此页，跳转过程会带上以下参数
          status : 支付状态，0 为成功，1 为失败或取消
          商户应在此页显示响应的提示，但出于安全原因，不能以此作为支付成功的凭证，支付成
          功凭证仅能以同步接口传递的数据为准
         */
        $request = \think\Request::instance();
        $data = $request->param();
        var_export($data);
    }

}
